package interfaces;

import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

/**
 * Interface a ser implementada por um communicator
 * 
 * @author robertow
 *
 */
public interface ICommunicator {

	void connectServer(String hostDescription);
	
	/**
	 * Retorna uma conexao socket
	 * @return
	 */
	SocketChannel getSocket();
	
	/**
	 * Retorna a descrição do canal servidor
	 * @return
	 */
	String serverChannelDescription();
	
	/**
	 * Retorna a descrição do canal cliente
	 * @return
	 */
	String clientLocalChannelDesc();

	/**
	 * Retorna a descrição do canal cliente remoto
	 * @return
	 */
	String clientRemoteChannelDesc();

	/**
	 * Retorna um Array de bytes de um canal
	 * @return
	 */
	ByteBuffer receiveMessages();
	
	/**
	 * Escreve um array de bytes em um canal socket
	 * 
	 * @param channel: Canal Socket
	 * @param writeBuffer: Mensagem para ser enviada
	 */
	void channelWrite(SocketChannel channel, ByteBuffer writeBuffer);

	/**
	 * Envia uma mensagem NODE_STATUS para um canal
	 * 
	 * @param channel: Canal socket
	 * @param workerId: Identificação do trabalhador
	 * @param workload: Carga de Trabalho de um trabalhador
	 * @param capacity: Capacidade de trabalhado de um trabalhador
	 * @param updateDate: Data em que a atualização de status ocorreu
	 */
	void sendMsgNodeStatus(SocketChannel channel, String workerId, float capacity, int workload, long updateDate);

	/**
	 * Envia uma mensagem BOSS_CONTACT
	 * 
	 * @param channel: Canal socket
	 * @param workerId: Identificação do trabalhador
	 */
	void sendMsgBossContact(SocketChannel channel, String workerId);

	/**
	 * Envia uma mensagem JOB_RESULT
	 * 
	 * @param channel: Canal socket
	 * @param workerId: Identidicação do trabalhador
	 * @param jobId: Identificação da tarefa
	 * @param resultDescription: Descrição da tarefa
	 */
	void sendMsgJobResult(SocketChannel channel, String workerId, String jobId, byte[] resultDescription);

	/**
	 * Envia uma mensagem NEW_JOB
	 * 
	 * @param channel: Canal socket
	 * @param jobId: Identificação da tarefa
	 * @param jobDescription: Descrição da tarefa
	 */
	void sendMsgNewJob(SocketChannel channel, String jobId, byte[] jobDescription);

	/**
	 * Envia uma mensagem NEW_WORKER
	 * 
	 * @param channel: Canal Socket
	 * @param nodeId: Identificação do trabalhador
	 * @param nodeChannelDescription: Descrição do canal do trabalhador
	 */
	void sendMsgNewWorker(SocketChannel channel, String nodeId, String nodeChannelDescription);

	/**
	 * Envia uma mensagem NODE_STARTED
	 * 
	 * @param channel: Canal socket
	 * @param nodeId: Identificação do trabalhador
	 * @param nodeChannelDescription: Descrição do canal do trabalhador
	 */
	void sendMsgNodeStarted(SocketChannel channel, String nodeId, String nodeChannelDescription);
}
